package com.funcablaze.window;

import com.funcablaze.component.Scene.Scene;
import com.funcablaze.component.control.Theme;
import com.funcablaze.listener.Input;
import org.lwjgl.glfw.GLFW;

public abstract class BaseWindow {
	
	protected Input.WindowListener windowListener;
	protected Scene scene;
	protected boolean isVisible = false;
	protected int width, height, x, y;
	protected Theme.ThemeType theme = Theme.ThemeType.Default;
	protected long windowHandle = -1;
	
	/**
	 * 设置窗口监听器
	 * @param windowListener 窗口监听器
	 */
	public void setWindowListener(Input.WindowListener windowListener) {
		this.windowListener = windowListener;
	}
	
	/**
	 * 创建窗口
	 * @param title 窗口标题
	 * @param width 窗口宽度
	 * @param height 窗口高度
	 */
	protected abstract void _create(String title, int width, int height);
	
	/**
	 * 切换场景
	 * @param scene 新场景
	 */
	public void changeScene(Scene scene) {
		this.scene = scene;
		scene.bindWindow(this);
	}
	
	/**
	 * 获取当前场景
	 * @return 当前场景
	 */
	public Scene getScene() {
		return scene;
	}
	
	/**
	 * 获取窗口是否可见
	 * @return 窗口可见
	 */
	public boolean isVisible() {
		return isVisible;
	}
	
	/**
	 * 获取窗口大小
	 * @return 窗口大小 {width, height}
	 */
	public int[] getSize() {
		return new int[]{width, height};
	}
	
	/**
	 * 获取窗口位置
	 * @return 窗口位置 {x, y}
	 */
	public int[] getPosition() {
		return new int[]{x, y};
	}
	
	/**
	 * 设置窗口主题
	 * @param theme 主题
	 */
	public void setTheme(Theme.ThemeType theme) {
		this.theme = theme;
	}
	
	/**
	 * 获取窗口主题
	 * @return 主题
	 */
	public Theme.ThemeType getTheme() {
		return theme;
	}
	
	
	
	/**
	 * 设置窗口大小
	 * @param width 宽度
	 * @param height 高度
	 */
	public void setSize(int width, int height) {
		if (windowHandle != -1) {
			GLFW.glfwSetWindowSize(windowHandle, width, height);
		} else {
			throw new IllegalStateException("窗口不能在创建之前设置大小。");
		}
	}
	
	/**
	 * 设置窗口标题
	 * @param title 窗口标题
	 */
	public void setTitle(String title) {
		if (windowHandle != -1) {
			GLFW.glfwSetWindowTitle(windowHandle, title);
		} else {
			throw new IllegalStateException("窗口不能在创建之前设置标题。");
		}
	}
	
	/**
	 * 设置窗口位置
	 * @param x x坐标
	 * @param y y坐标
	 */
	public void setPosition(int x, int y) {
		if (windowHandle != -1) {
			this.x = x;
			this.y = y;
			GLFW.glfwSetWindowPos(windowHandle, x, y);
		} else {
			throw new IllegalStateException("窗口不能在创建之前设置位置。");
		}
	}
	
	/**
	 * 获取窗口句柄
	 * @return 窗口句柄
	 */
	public long getWindowHandle() {
		return windowHandle;
	}
	
	/**
	 * 显示窗口
	 */
	public abstract void show();
	
	/**
	 * 隐藏窗口
	 */
	public abstract void hide();
	
	/**
	 * 最小化窗口
	 */
	public abstract void minimize();
	/**
	 * 关闭窗口
	 */
	public abstract void close();
}
